package com.ruoyi.epidemic.service.impl;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeException;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.ruoyi.epidemic.service.QRCodeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * @author wf
 * @date 2022年04月05日
 */
@Service
@Slf4j
public class QRCodeServiceImpl implements QRCodeService {

    // 自定义参数，这部分是Hutool工具封装的
    private static QrConfig initQrConfig() {
        QrConfig config = new QrConfig(400, 400);
        // 设置边距，既二维码和背景之间的边距
      //  config.setMargin(3);
        // 设置前景色，既二维码颜色（青色）
        //config.setForeColor(Color.CYAN.getRGB());
        // 设置背景色（灰色）
       // config.setBackColor(Color.GRAY.getRGB());
        return config;
    }

    /**
     * 生成到文件
     *
     * @param content
     * @param filepath
     */
    @Override
    public void createQRCode2File(String content, String filepath) {
        try {
            QrCodeUtil.generate(content, initQrConfig(), FileUtil.file(filepath));
            log.info("生成二维码成功, 位置在：{}！", filepath);
        } catch (QrCodeException e) {
            log.error("发生错误！ {}！", e.getMessage());
        }
    }

    /**
     * 生成到流
     *
     * @param content
     * @param response
     */
    @Override
    public void createQRCode2Stream(String content, HttpServletResponse response) {
        try {
            QrCodeUtil.generate(content, initQrConfig(), "png", response.getOutputStream());
            log.info("生成二维码成功!");
        } catch (QrCodeException | IOException e) {
            log.error("发生错误！ {}！", e.getMessage());
        }
    }

    /**
     * 初始化带有文本logo的二维码生成配置
     * @param logoStr logo文本内容
     * @return
     */
    private static QrConfig initQrConfig(int width, int height, String logoStr) {
        QrConfig config = new QrConfig(width, height);
        try {
            Image img = createImage(logoStr, new Font("宋体", Font.BOLD, 20), 100, 100);
            config.setImg(img);
            log.info("生成二维码logo成功!");
        } catch (Exception e) {
            log.error("发生错误！ {}！", e.getMessage());
        }
        return config;
    }

    /**
     * 通过文字生成图片
     * @param str
     * @param font
     * @param width
     * @param height
     * @return
     * @throws Exception
     */
    public static Image createImage(String str, Font font, Integer width, Integer height) {
        BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();
        g.setClip(0, 0, width, height);
        g.setColor(Color.white);
        g.fillRect(0, 0, width, height);// 先用黑色填充整张图片,也就是背景
        g.setColor(Color.black);// 在换成黑色
        g.setFont(font);// 设置画笔字体
        // /** 用于获得垂直居中y */
        Rectangle clip = g.getClipBounds();
        FontMetrics fm = g.getFontMetrics(font);
        int ascent = fm.getAscent();
        int descent = fm.getDescent();
        int y = (clip.height - (ascent + descent)) / 2 + ascent;
        g.drawString(str, 0, y);// 画出字符串
        g.dispose();
        return image;
    }
}
